# 파이썬 기본훑기

  • 파이썬 문법 수업이 아닌, 수업에서 다루게 될 기본적인 문법들만 빠르게 알려주는 시간입니다.
  • 더 궁금한 부분이 있다면 구글링을 해보시고, 그래도 모르는 부분이 있다면 편하게 질문 남겨주세요 !

# 파이썬 명령어

  • 파이썬 버전을 확인하고 싶을 때

    $ python --version
    # Python 3.10.1
    
  • Interactive 모드로 실행하고 싶을 때

    $ python
    
  • python 명령어로 파이썬 파일을 실행할 때

    $ python [파이썬_파일]
    

# 기본 명령어

# 출력

  • 로그를 출력할 때는 print를 활용합니다.
print("HI") # HI
print("H"+"I") # HI
print("HI"+1) # HI1

# 변수

# 변수 선언

  • 변수를 선언할 때는 변수명 = 값 으로 표현합니다.
name = "grab" # str 타입을 가지는 "grab"이 들어갑니다.
age = 25 # int 타입을 가지는 25가 들어갑니다.
friends = ["humphrey", "kyle", "hardy"] # list 타입을 가지며 3개의 인자를 가집니다.

# 네이밍

  • 파이썬에서 변수, 함수의 네이밍은 snake_case 를 클래스는 PascalCase 를 사용합니다.

    my_friends = None
    
    class GoodFriend:
        ...
    

# 기본 자료형

  • 파이썬은 동적으로 타입이 관리되는 프로그래밍 언어입니다. 따라서 위와 같이 타입을 별도로 명시해주지 않아도, 내부적으로 해당 변수가 어떤 타입을 가지고 있는지 알고 있습니다.

# 문자열(String)

str1 = "hello"
str2 = "grab"

type(str1) # 변수의 타입을 확인할 수 있음
# <class 'str'>

f"{str1} {str2}!" # f string을 활용해서 변수를 문자열에 쉽게 합칠 수 있음.
# "hello grab"

str1[0:3] #인덱스를 기준으로 string을 따로 가져올 수 있음
# 인덱스 0부터 2까지
# "gra"

# 숫자형(Number)

  • 숫자형 타입에는 크게 int(정수) , float(실수) , complex 가 존재합니다.
num1 = 10
num2 = -10.5

type(num1)
# <class 'int'> 
type(num2)
# <class 'float'> 

"my age is " + num1 # 문자열과 숫자의 결합이 가능함.
# my age is 10

# None

  • 아무것도 없음을 표현할 때 사용되는 자료형
a = None

# 불리언(Boolean)

  • True/False가 존재함
a = True
b = False

b = bool('')  #False
c = bool([])  #False
d = bool('a') #True
e = bool(None)#False

# 데이터 구조(Data Structure)

  • 구조적으로 데이터를 담을 수 있도록 돕는 특정 데이터 타입임.
  • 대표적으로 list , dictionary , set, tuple 이 있음.

# 리스트(list)

  • 다른 프로그래밍 언어의 배열의 역할과 동일합니다
arr0 = list()
arr1 = ["그랩"] # arr0과 동일함
arr2 = [1,2,3]

# list 요소에 접근하기
arr2[0] #0번째 인덱스 요소를 가져옴
# 1  

# list의 빌트인 메서드 (append, pop)
arr1.append("카일") # 요소를 추가함
# arr1 : ["카일"]

arr1.pop(0) # 특정 인덱스의 요소를 삭제함
# arr1 : ["카일"] 

len(arr2) #길이를 구하는 len 함수
# 3

# 딕셔너리(dictionary)

  • 딕셔너리는 key: value 형태로 데이터를 저장합니다
dict1 = {"name": "grab", "age": 28}
dict2 = dict()

# 값 넣기
dict2["fruits"] = ["banana", "apple"] #dict2에 fruits라는 키로 리스트를 넣는다.
# dict2 : {"fruits": ["banana", "apple"]}

# 값 접근하기1
dict1["name"] 
# grab

# 값 접근하기2
dict1.get("address", "no address") #첫번째 인자에 key, 두번째 인자에 기본 값을 넣는다.
# no address

# dict의 빌트인 메서드(values, keys)
dict1.values() #value을 list 형태로 반환
# ["grab", 28]

dict1.keys() #key를 list 형태로 반환
# ["name","age"]

# 튜플(tuple)

  • list와 비슷하게 순서를 가지고 있지만, 한번 선언된 값을 변경할 수 없습니다(불변성)
tuple1 = (1, 2, 3)

tu[0] = 100 # 새로운 값을 할당하려고 하면 오류가 발생한다. 
#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#TypeError: 'tuple' object does not support item assignment

# 집합(set)

  • 집합 자료형은 list와 비슷해보이지만, 중복을 허용하지 않고 순서가 따로 없습니다.
  • 보통 산술적으로 교집합, 합집합, 차집합을 구할 때 사용한다.
s1 = set([1, 2, 3, 3])
# {1, 2, 3}

# 조건문과 반복문

# 조건문

  • if [표현식]:... elif [표현식]:... else:...:로 조건문을 나타냅니다.
    • 값을 비교할 때는 ==, , >, , < 을 주로 사용합니다.
num=50
if num < 10:
    print("한 자리수 입니다.")
elif 10 <= num < 100:
    print("두 자리수 입니다.")
else: 
    print("세 자리수 이상입니다.")

# 반복문

  • for [단일객체] in [반복가능한 객체] 을 활용합니다. 이때 반복가능한 객체는 List, Tuple이 대표적입니다.
names = ["grab", "hardy", "humphrey", "kyle"]

for name in names:
    print(name)
# grab
# hardy
# humphrey
# kyle
  • 순서 index를 함께 알고 싶을 땐 enumerate 를 활용합니다.
for idx, name in enumerate(names):
    print(idx, name)
# 0 grab
# 1 hardy
# 2 humphrey
# 3 kyle

# 함수

  • 함수의 시그니처는 def 함수명(파라미터):로 표현합니다.
  • 내부 로직은 보통 Tab, 2space, 4space 으로 들여써서 작성합니다.
def hello():
    print("HI")

# Function Parameters
def multiply(a, b):
    return a * b

# default parameter
def sayHello(name="grab"):
    return f"Hi {name}"

msg = sayHello("hardy") 
print(msg) # Hi hardy

# parameter 이름을 직접 넣어줄 수도 있다.
sayHello(name="hardy") # Hi hardy 반환

sayHello() # Hi grab 반환

# 클래스

  • 함수와 비슷하게 class 클래스명: 으로 표현합니다
    • 파이썬의 클래스는 상속이 가능합니다 class 클래스명(상속할 클래스명): 으로 표현합니다
  • 인스턴스 자신을 지칭할 때 self로 표현하며 모든 클래스의 메소드의 첫번째 인자에 들어갑니다
  • 속성(Attribute)은 self에 선언해줍니다.
    • 보통 생성자에서 인스턴스의 속성을 많이 정의해줍니다.
# Case 1
class Person:
    # 생성자 메서드
    def __init__(self, name):
        self.name = name
    
    def study(self):
        print(f"{self.name}은 열심히 공부합니다")

# 클래스를 인스턴스화 합니다.
p = Person(name="grab")

# 메서드를 호출합니다.
p.study() # grab은 열심히 공부합니다.

# 인스턴스 변수에 접근할 수 있습니다 (참고: 파이썬은 별도의 접근제어자가 없습니다)
p.name # grab
  • 클래스 변수, 클래스 메서드는 인스턴스화하지 않고 사용이 가능합니다.
    • 클래스 메서드와 유사하게 스태틱 메서드(static method)도 있습니다.
# Case 2 
class Car:
	
    # 클래스 변수
    fuel=100 
	
    # 클래스 메서드 
    @classmethod
    def show_fuel(cls): # 첫번째 인자에 현재 클래스가 들어옵니다. 
        print(cls.fuel)

# 스태틱 메서드는 인스턴스화하지 않고 바로 사용할 수 있습니다
Car.show_fuel() # 100
# 클래스 변수도 바로 사용 가능합니다.
Car.fuel # 100

# 모듈과 패키지

  • 모듈은 변수, 함수등을 포함하는 파일입니다.
  • 패키지는 모듈을 모아놓은 디렉토리라고 보면 됩니다.
├── a
│   ├── b.py
│   └── c.py
└── d.py

# a 디렉토리는 b와 c라는 모듈을 담은 패키지입니다.
# a/b.py
filename = "b.py"

def get_info():
    return {"filename": filename}
  • 모듈을 다른 모듈에서 사용하기 위해선 import를 사용합니다.

    • import시 모듈의 확장자인 .py는 붙이지 않습니다.
    • 모듈을 import하면 내부에 있는 변수와 함수를 전부 사용할 수 있습니다.
    #a/c.py
    import b
    
    print(get_info())
    # {'filename': 'b.py'}
    
  • 패키지를 불러오기 위해선 from ... import을 사용합니다.

    #d.py
    from a import b
    
    print(get_info())
    # {'filename': 'b.py'}
    
  • 모듈의 특정 변수나 함수만 불러올 수도 있습니다.

    #a.py
    from a.b import get_info
    
    print(get_info()) # Works
    print(filename) # Error
    
  • 기본적으로 파이썬에서는 파일을 불러올 때 절대경로를 기준으로 불러옵니다. 절대경로의 기준은 일반적으로 프로젝트의 루트 경로를 기준으로 합니다

    • (import sys) sys.path를 통해 절대경로로 잡히는 루트 경로들을 확인이 가능합니다
    #c.py
    from a import b
    
    print(filename) 
    # b.py
    
  • 파이썬 파일을 직접 실행할 때만 실행되는 구문을 작성할 때는 아래와 같이 활용합니다.

    # d.py
    print("Hello")
    
    if __name__ == "__main__":
        print("Bye")
    
    ---
    python d.py
    # Hello
    # Bye
    

# 타입

  • 파이썬은 동적 타입 언어로, 코드에서 직접적으로 타입을 명시해주지 않아도 내부적으로 알아서 타입을 추론하게 됩니다.

  • 하지만 코드를 작성하는 시점에서 해당 변수의 타입, 함수가 반환하는 타입 등을 제대로 확인하지 못하는 이슈가 있습니다.

    • 기본적으로 IDE를 사용하면 내부적으로 간단한 타입을 추론해주긴 하지만, 한계가 있습니다.
  • 파이썬에서는 타입을 명시적으로 적어줄 수 있습니다.

    • 보통변수, 함수에 : 을 통해 type annotation을 해줍니다.
      • 함수에서 return type을 명시해줄 때는 를 사용합니다.
    • 기본 type으로는 str, int, float, list, dict 등이 존재합니다.
    def hello(name: str) -> None: 
        print(f"Hello {name}")
    
    def get_banana() -> str:
        return "Banana"
    
    def sum_nums(nums: list) -> int:
        return sum(nums) 
    # sum_nums([1,2,3]) 
    # 6
    
    # 기본적으로 name에는 문자열이 들어가기 때문에 type annotation을 해주지 않아도 기본 추론이 가능합니다. 
    name: str = "grab" 
    
    • 조금 더 자세한 타입을 명시해주고 싶을 때 typing 모듈을 사용합니다.
    from typing import List
    
    class School:
        def set_names(self, names: List[str]) -> None : 
            self.names = names 
    
        def set_schedule(self, schedule: Dict[str, str]) -> None:
            self.schedule = sechedule
    
    school = School()
    school.set_names(names=["grab", "larry"]
    school.set_schedule(schedule={
    	"09:00-10:00": "수학시간"
    })
    

TIP

기본적으로 파이썬에서는 타입을 잘못 입력하더라도 컴파일 타임에서 오류가 발생하지 않습니다 (런타임에서 오류가 날 수도 있겠죠)

컴파일 타임에서 타입 체크를 하고 싶을 때 mypy를 많이 활용합니다.

# 예외처리

  • 예외 발생시키기

    raise Exception("에러 발생")
    
    # Traceback (most recent call last):
    #   File "<string>", line 1, in <module>
    # Exception: 에러 발생
    
  • 에러 캐치하기

    • try...except 를 활용하여 에러를 캐치합니다.
      • except 를 할 때 처리할 예외를 넣어줍니다. 그리고 해당 예외 정보를 처리하고 싶다면 as 이름 으로 처리 가능합니다.
    • finally 는 try문이 끝나고 반드시 동작해야 할 코드를 넣어줍니다.
    try:
        print("HI")
        raise Exception("에러 발생")
        print("BYE")
    except Exception as e:
        print(e)
    finally:
        print("FINISHED")
    
    # HI
    # 에러 발생
    # FINISHED
    
Last Updated: 2/20/2022, 1:51:31 PM

CC-BY-NC-ND-4.0 Licensed | Copyright © 2021-present Grab